#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
#include<sys/time.h>
#include<time.h>
#include<fcntl.h>

//编写一个守护进程，每隔２Ｓ获取一次系统时间，将这个时间写入磁盘文件
/*
   分析：
   １．首先要按照守护进程的创建步骤创建守护进程．
   ２．每隔２秒：使用setitimer函数设置时钟，该时钟发送的是SIGALRM信号
   ３．信号操作：注册信号处理函数，还有一个信号处理函数（回调）
   ４．获取一次系统时间：time函数的使用，ctime函数的使用
   ５．写入磁盘文件：文件操作函数：open write close


   优化：
   不再频繁的打开和关闭文件
   如何控制log文件大小　　test.log  test.log.1 test.log.2
 */
int fd;
int flag = 0;
int i=0;

void myfunc(int signo)
{
	//获取当前系统时间
	time_t t;
	time(&t);
	char *p=ctime(&t);
	//将时间写入文件
	if(flag==0)
	{
		//打开文件
		fd = open("./mydaemon.log",O_RDWR | O_CREAT | O_APPEND ,0777);
		if(fd<0)
		{
			perror("open error");
			return;
		}
		flag=1;
	}
	write(fd,p,strlen(p));
	return;
}


int main()
{
	//创建守护进程首先创建子进程
	pid_t pid = fork();
	if(pid<0 || pid > 0)
	{
		exit(-1);
	}
	//子进程调用setsid函数创建会话'
	setsid();

	//改变当前的工作目录
	chdir("/home/wdd/Desktop/c++_ws/process_sig");

	//改变文件掩码
	umask(0000);

	//关闭标准输入，输出，和错误输出文件描述符
	close(STDIN_FILENO);
	close(STDOUT_FILENO);
	close(STDERR_FILENO);

	//核心操作
	//注册信号处理函数
	struct sigaction act;
	act.sa_handler = myfunc;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);
	sigaction(SIGALRM,&act,NULL);

	//设置时钟
	struct itimerval tm;
	tm.it_interval.tv_sec = 2;
	tm.it_interval.tv_usec = 0;
	tm.it_value.tv_sec = 3;
	tm.it_value.tv_usec = 0;
	setitimer(ITIMER_REAL,&tm,NULL);
	

	char str1[64];
	memset(str1,0x00,sizeof(str1));
	strcpy(str1,"./mydaemon.log");
	char name[64];
	memset(name,0x00,sizeof(name));
	

	while(1)
	{
		//获取文件大小
		int size = lseek(fd,0,SEEK_END);
		if(size > 100)
		{
			close(fd);
			sprintf(name,"%s_%d",str1,i);
			rename("./mydaemon.log",name);
			flag=0;
			i++;
		}	
	}
	
	close(fd);

	return 0;
}

